﻿#include<iostream>
using namespace std;

//int main() {
//	cout << "Hello world!" << endl;
//	return 0;
//}

//namespace zc {
//	//可以定义变量
//	int number = 10;
//	//也可以定义函数
//	int Add(int x, int y) {
//		return x + y;
//	}
//	//还可以定义类型
//	struct N {
//		int a = 1;
//	}N;
//}
//
////2、using将某个成员展开
//using zc::Add;
//
////3、展开全部成员
//using namespace zc;	
//
//int main()
//{
//	//未声明的标识符
//	//cout << number << endl;
//
//	//1、指定命名空间访问
//	cout << zc::number << endl;
//
//	//2、using将某个成员展开
//	cout << Add(10, 20) << endl;
//
//	//3、展开全部
//	cout << number << endl;
//	cout << Add(1, 1) << endl;
//	cout << N.a<< endl;
//
//	return 0;
//}


////缺省参数
////1、全缺省参数
//void function_1(int a = 1, int b = 2, int c = 3) {
//	cout << "a=" << a << endl;
//	cout << "a=" << b << endl;
//	cout << "a=" << c << endl;
//}
//
////2、半缺省参数
//void function_2(int a, int b = 2, int c = 3) {
//	cout << "a=" << a << endl;
//	cout << "a=" << b << endl;
//	cout << "a=" << c << endl;
//}
//
//int main()
//{
//	function_1();
//	cout << endl;
//	function_1(10);
//	cout << endl;
//	function_2(20);
//	return 0;
//}

////函数重载
////下面两个是函数参数类型不同，构成函数重载
//int Add(int a = 1, int b = 1) {
//	return a + b;
//}
//
//double Add(double a, double b) {
//	return a + b;
//}
//
////参数类型顺序不同，也构成
//void func(int a, char b) {
//	cout << "a=" << a << ":" << "b=" << b << endl;
//}
//void func(char a, int b) {
//	cout << "a=" << a << ":" << "b=" << b << endl;
//}
//
//int main()
//{
//	cout << Add(10, 10) << endl;
//	cout << Add(1.2, 1.3) << endl;
//
//	func(10, 'A');
//	func('B', 20);
//
//	return 0;
//}


//int main()
//{
//	int num = 10;
//	//int& a;//没有初始化
//
//	int& b = num;
//	int c = 20;
//	b = c;//简单的赋值，因为C++规定引用不能改变指向
//	cout << &num << endl;
//	cout << &b << endl;
//	cout << &c << endl<<endl;
//
//	cout << num << endl;
//	cout << b << endl;
//	cout << c << endl;
//
//	return 0;
//}


//void Swap(int& x, int& y) {
//	int tmp = x;
//	x = y;
//	y = tmp;
//}
//
//void Swap1(int* a, int* b) {
//	int tmp = *a;
//	*a = *b;
//	*b = tmp;
//}
//
//int main()
//{
//	//引用
//	int number1 = 10, number2 = 20;
//	cout << number1 << " " << number2 << endl;
//	Swap(number1, number2);
//	cout << number1 << " " << number2 << endl;
//	cout << endl;
//
//	int number3 = 30, number4 = 40;
//	cout << number3 << " " << number4 << endl;
//	Swap1(&number3, &number4);
//	cout << number3 << " " << number4 << endl;
//	return 0;
//}


//int main()
//{
//	int a = 10;//可读可写的权限
//	const int& b = a;//const修饰后变为只读，此为权限缩小，是可以的。
//
//	const int c = 20;//只读权限
//	//int& d = c;//可读可写，权限放大，不可以的。必须加const修饰。
//	const int& d = c;
//
//	return 0;
//}
//


//int main()
//{
//	//int& a = 30;//一个常数，要想引用，必须加const
//	const int& a = 30;
//
//	//int& b = a + 2;//表达式有常性，也要用const修饰
//	const int& b = a + 2;
//
//	//隐式类型转换
//	double c = 66.66;
//	//int& d = c;//也是有常性的
//	const int& d = c;
//
//	return 0;
//}
//


// 实现⼀个ADD宏函数的常⻅问题
//#define ADD(int a, int b) return a + b;
//#define ADD(a, b) a + b;
//#define ADD(a, b) (a + b)

// 正确的宏实现
#define ADD(a, b) ((a) + (b))
// 为什么不能加分号?
// 要是加了分号，那么在直接输出后面调用函数就会出现错误。

// 为什么要加外⾯的括号?
// 解决运算符优先级问题的。

// 为什么要加⾥⾯的括号?
//也是解决优先级问题的。
int main()
{
	int ret = ADD(1, 2);
	cout << ADD(1, 2) << endl;//要是加分号，此时就会出现错误。
	cout << ADD(1, 2) * 5 << endl;//不叫外面的括号，那么此时会出现(1)+(2)*5=11
	int x = 1, y = 2;
	ADD(x & y, x | y); // -> (x&y+x|y)，不加里面括号也会出问题。
	return 0;
}



